# NumPy 数组的“加减乘除”算术运算，分别对应 add()、subtract()、multiple() 以及 divide() 函数。
# 倒数reciprocal  指数power  取余mod
# 复数数组处理 real imag conj  angle
import numpy as np

# 做算术运算时，输入数组必须具有相同的形状，或者符合数组的广播规则，才可以执行运算。
a = np.arange(9, dtype=np.float_).reshape(3, 3)
print(a)
# [[ 0. 1. 2.]
# [ 3. 4. 5.]
# [ 6. 7. 8.]]
b = np.array([10, 10, 10])
print(b)  # [10 10 10]
# 数组加法运算
print(np.add(a, b))
# [[ 10. 11. 12.]
# [ 13. 14. 15.]
# [ 16. 17. 18.]]
# 数组减法运算
print(np.subtract(a, b))
# [[-10. -9. -8.]
# [ -7. -6. -5.]
# [ -4. -3. -2.]]
# 数组乘法运算
print(np.multiply(a, b))
# [[ 0. 10. 20.]
# [ 30. 40. 50.]
# [ 60. 70. 80.]]
# 数组除法运算
print(np.divide(a, b))
# [[ 0. 0.1 0.2]
# [ 0.3 0.4 0.5]
# [ 0.6 0.7 0.8]]


# numpy.reciprocal() 该函数对数组中的每个元素取倒数，并以数组的形式将它们返回。
# 当数组元素的数据类型为整型（int）时，对于绝对值小于 1 的元素，返回值为 0，而当数组中包含 0 元素时，返回值将出现 overflow（inf）
a = np.array([0.25, 1.33, 1, 0, 100])
# 对数组a使用求倒数操作
print(np.reciprocal(a))  # [ 4.         0.7518797  1.               inf  0.01     ]
# __main__:1: RuntimeWarning: divide by zero encountered in reciprocal
# b数组的数据类型为整形int
b = np.array([100], dtype=int)
print(np.reciprocal(b))  # 0

# numpy.power() 该函数将 a 数组中的元素作为底数，把 b 数组中与 a 相对应的元素作幂 ，最后以数组形式返回两者的计算结果
a = np.array([10, 100, 1000])
# 调用 power 函数
print(np.power(a, 2))  # [    100   10000 1000000]
b = np.array([1, 2, 3])
print(np.power(a, b))  # [        10      10000 1000000000]

# numpy.mod() 返回两个数组相对应位置上元素相除后的余数，它与 numpy.remainder() 的作用相同 。
a = np.array([11, 22, 33])
b = np.array([3, 5, 7])
# a与b相应位置的元素做除法
print(np.mod(a, b))  # [2 2 5]
# remainder方法一样
print(np.remainder(a, b))  # [2 2 5]

# 复数数组处理函数
# numpy.real() 返回复数数组的实部；
# numpy.imag() 返回复数数组的虚部；
# numpy.conj() 通过更改虚部的符号，从而返回共轭复数；
# numpy.angle() 返回复数参数的角度，该函数的提供了一个 deg 参数，
# 如果  deg=True，则返回的值会以角度制来表示，否则以以弧度制来表示。
a = np.array([-5.6j, 0.2j, 11., 1 + 1j])
print(np.real(a))  # [ 0. 0. 11. 1.]
print(np.imag(a))  # [-5.6 0.2 0. 1. ]
print(np.conj(a))  # [ 0.+5.6j 0.-0.2j 11.-0.j 1.-1.j ]
print(np.angle(a))  # [-1.57079633 1.57079633 0. 0.78539816]
print(np.angle(a, deg=True))  # [-90. 90. 0. 45.]
